/*
 * 版权所有 (C) 2001-2015 深圳市艾派应用系统有限公司。保留所有权利。
 * 版本：
 * 修改记录：
 *		1、Feb 28, 2015，miaojr创建。 
 */
package com.ordering.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 图片操作工具类
 */
public class ImageUtils
{
    /**
     * 图片处理工具方法,
     * @param oldImg 原始图像 
     * @param toWidth 处理后图片的宽度 
     * @param toHeight 处理后图片的高度 
     * @return 返回处理后的图像
     */
    public static BufferedImage createNew(BufferedImage oldImg, int toWidth, int toHeight)
    {
        BufferedImage newImg = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
        newImg.getGraphics().drawImage(
            oldImg.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
        return newImg;
    }
    
    /**
     * 将一般的文件对象转化为图像文件对象
     * @param imgFile 源文件
     * @return 图片文件对象
     * @throws Exception
     */
    public static BufferedImage createImage(File imgFile) throws Exception
    {
        return ImageIO.read(imgFile);
    }
    
    /**
     * 共享文件服务器使用方法，将一般的文件对象转化为图像文件对象
     * @param imgFile 源文件
     * @return 图片文件对象
     * @throws Exception
     */
    public static BufferedImage createImage(SmbFile smbFile) throws Exception
    {
        InputStream intp = null;
        try
        {
            intp = new SmbFileInputStream(smbFile);
            return ImageIO.read(intp);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            if (intp != null)
            {
                intp.close();
            }
        }
    }
    
    /**
     * 保存图片文件
     * @param img 图片文件对象
     * @param filePath 保存路径
     * @param fileName 图片名称（包括后缀名）
     * @return
     */
    public static boolean saveNewImg(BufferedImage img, String filePath, String fileName) throws Exception
    {
        OutputStream newimage = null;
        
        try
        {
            String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
            newimage = new SmbFileOutputStream(new SmbFile(filePath.concat("/").concat(fileName)));
//            newimage = new FileOutputStream(new File(filePath.concat("/").concat(fileName)));
            if("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType))
            {
                return saveJPEG(img, newimage);
            }
            ImageIO.write(img, fileType, newimage);
            img.flush();
            return true;
            
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            if (newimage != null)
            {
                newimage.close();
            }
        }
    }
    
    public static boolean saveJPEG(BufferedImage img, OutputStream newimage) throws Exception
    {
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
        JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(img); /* 压缩质量 */
        jep.setQuality(1f, true);
        encoder.encode(img, jep); /* 近JPEG编码 */
        return true;
    }
    
    /**
     * 将图片文件按源比例生成指定宽度的新图片文件，并保存到指定路径
     * @param file 图片文件对象
     * @param toWidth 指定宽度(大于0)
     * @param filePath 保存路径
     * @param saveFileName 新文件名称
     * @return
     */
    public static boolean createNewImage(File imgFile, int toWidth, int toHeight, String filePath, String saveFileName) throws IOException, Exception
    {
        if(imgFile == null || imgFile.length() == 0)
        {
            throw new Exception("转化图像文件对象失败，源文件为空！");
        }
        
        if(toWidth <= 0)
        {
            throw new Exception("转化宽度必须大于0！");
        }
        
        if(toHeight <= 0)
        {
            throw new Exception("转化高度必须大于0！");
        }
        
        if(filePath == null || "".equals(filePath.trim()))
        {
            throw new Exception("保存路径不能为空！");
        }
        
        if(saveFileName == null || "".equals(saveFileName.trim()))
        {
            throw new Exception("新图片名称不能为空！");
        }
        
        BufferedImage img = createImage(imgFile);
        
        int oldWidth = img.getWidth();
        int oldHeight = img.getHeight();
        
        if((double) oldWidth/(double) toWidth > (double) oldHeight/(double) toHeight)
        {
            toHeight = oldHeight * toWidth/oldWidth;
        }
        else
        {
            toWidth = oldWidth * toWidth/oldHeight;
        }
        img = createNew(img, toWidth, toWidth);
        
        return saveNewImg(img, filePath, saveFileName);
    }
    /**
     * 共享文件服务器使用方法，将图片文件按源比例生成指定宽度的新图片文件，并保存到指定路径
     * @param file 图片文件对象
     * @param toWidth 指定宽度(大于0)
     * @param filePath 保存路径
     * @param saveFileName 新文件名称
     * @return
     */
    public static boolean createNewImage(SmbFile imgFile, int toWidth, int toHeight, String filePath, String saveFileName) throws IOException, Exception
    {
        if(imgFile == null || imgFile.length() == 0)
        {
            throw new Exception("转化图像文件对象失败，源文件为空！");
        }
        
        if(toWidth <= 0)
        {
            throw new Exception("转化宽度必须大于0！");
        }
        
        if(toHeight <= 0)
        {
            throw new Exception("转化高度必须大于0！");
        }
        
        if(filePath == null || "".equals(filePath.trim()))
        {
            throw new Exception("保存路径不能为空！");
        }
        
        if(saveFileName == null || "".equals(saveFileName.trim()))
        {
            throw new Exception("新图片名称不能为空！");
        }
        
        BufferedImage img = createImage(imgFile);
        
        int oldWidth = img.getWidth();
        int oldHeight = img.getHeight();
        
        if((double) oldWidth/(double) toWidth > (double) oldHeight/(double) toHeight)
        {
            toHeight = oldHeight * toWidth/oldWidth;
        }
        else
        {
            toWidth = oldWidth * toHeight/oldHeight;
        }
        img = createNew(img, toWidth, toHeight);
        
        return saveNewImg(img, filePath, saveFileName);
    }
}
